#pragma once
#include "../build/release-install-cpp11/include/muduo/net/TcpServer.h"
#include "../build/release-install-cpp11/include/muduo/net/EventLoop.h"
#include "../build/release-install-cpp11/include/muduo/net/TcpConnection.h"
#include "../build/release-install-cpp11/include/muduo/net/Buffer.h"
#include <iostream>
#include<string>
#include<unordered_map>

class DictServer
{
public:
    DictServer(uint16_t port):_server(&_baseloop,muduo::net::InetAddress("0.0.0.0",port)
    ,"DictServer",muduo::net::TcpServer::kReusePort)//启动地址重用
    {
        _dict.insert({"cxk","蔡徐坤"});
        _dict.insert({"dame","大咩"});
        _dict.insert({"damn","我勒个"});
        //设置网络监听文件的就绪时的回调函数处理
        _server.setConnectionCallback(
            [this](const muduo::net::TcpConnectionPtr& conn)->void {
                OnConnection(conn);
            }
        );
        //客户端就绪事件的回调函数处理
        _server.setMessageCallback(
            [this](const muduo::net::TcpConnectionPtr& conn,muduo::net::Buffer* buf,muduo::Timestamp T){

                DealMessage(conn,buf,T);
            }
        );
        
    }
    //muduo::net::TcpConnectionPtr一个客户端的连接对象--封装了fd网络文件描述符
    void OnConnection(const muduo::net::TcpConnectionPtr& conn)
    {
        //判断当前客户端的连接状态
        if(conn->connected())
        {
            std::cout<<"client connect"<<std::endl;
        }
        else 
        {
            std::cout<<"client disconnect"<<std::endl; 
        }
    }
    //翻译处理回调函数
    void DealMessage(const muduo::net::TcpConnectionPtr& conn,muduo::net::Buffer* buf,muduo::Timestamp T)
    {   
        //从缓冲区获取用户端发送的数据以字符串对象返回同时清空缓冲区数据
        std::string msg=buf->retrieveAllAsString();
        std::string ret;
        if(_dict.count(msg))
        {
            ret=_dict[msg];
        }
        else 
        {
            ret="没有cccc";
        }
        conn->send(ret);
    }
    void start()
    {
        _server.start();//开始启动服务端--获取网络监听文件，绑定ip和port
        _baseloop.loop();//死循环监听所有的fd的就绪状态
    }
private:
    //创建一个epoll模型来监听fds的就绪状态
    muduo::net::EventLoop _baseloop;
    std::unordered_map<std::string,std::string> _dict;
    //定义服务器对象--申请一个网络监听套接字并且绑定端口号和ip
    muduo::net::TcpServer _server;
};

int main()
{
    DictServer sever(8080);
    sever.start();
    return 0;
}